﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Reflection;
using System.IO;

namespace System.Data.DataModel
{
    class CsvConverter
    {
        /// <summary>
        /// IEnumerable型をCSV文字列に出力する。
        /// </summary>
        /// <param name="list">CSV文字列に変換したいジェネリックコレクション</param>
        /// <param name="type">変換したい行データのモデルクラスのインスタンス</param>
        /// <returns></returns>
        public static string CreateCsvText(IEnumerable<object> list, Object type)
        {
            StringBuilder builder = new StringBuilder();

            //ヘッダーの追加
            foreach (PropertyInfo property in type.GetType().GetProperties())
            {
                builder.Append( property.Name + "\",");
            }
            //最後のカンマを取り除く
            builder.Remove(builder.Length - 1, 1);
            builder.Append("\r\n");
            
            foreach (Object obj in list)
            {
                foreach (PropertyInfo property in type.GetType().GetProperties())
                {
                    builder.Append(property.PropertyType.FullName == "System.String" ? "\"" + property.GetValue(obj, null) + "\"," :
                                            property.GetValue(obj, null) + "," );
                }
                //最後のカンマを取り除く
                builder.Remove(builder.Length - 1, 1);
                builder.Append("\r\n");
            }
            return builder.ToString();
        }

        /// <summary>
        /// CSVファイルからIEnumerableに変換する。
        /// </summary>
        /// <param name="filePath">変換するファイルのパス</param>
        /// <param name="type">変換したい行データのモデルクラスのインスタンス</param>
        /// <returns></returns>
        public static IEnumerable<object> CreateIEnumerable(string filePath, object type)
        {
            StreamReader reader = new StreamReader(filePath);

            string[] properties = reader.ReadLine().Split(',');

            List<object> list = new List<object>();
            string line = string.Empty;
            while ((line = reader.ReadLine()) != null)
            {
                Type t = type.GetType();
                var data = Activator.CreateInstance(type.GetType());

                string[] lineText = line.Split(',');
                for(int i = 0; i < lineText.Length; i++)
                {
                    PropertyInfo property = t.GetProperty(properties[i]);
                    
                    switch (property.PropertyType.FullName)
                    {
                        case "System.String":
                            property.SetValue(data, lineText[i].Replace("\"\"", ""), null);
                            break;
                        case "System.DateTime":
                            property.SetValue(data, DateTime.Parse(lineText[i]), null);
                            break;
                        case "System.Int32":
                            property.SetValue(data, Int32.Parse(lineText[i]), null);
                            break;
                        case "System.Int64":
                            property.SetValue(data, Int64.Parse(lineText[i]), null);
                            break;
                        case "System.Double":
                            property.SetValue(data, Double.Parse(lineText[i]), null);
                            break;
                        default:
                            property.SetValue(data, lineText[i].Replace("\"\"", ""), null);
                            break;
                    }
                }

                list.Add(data);
            }
            return list;
        }
    }
}
